
#ifndef __CAN_HXX__
#define __CAN_HXX__

////////////////////////////////////////////////////////////////////////////////

#include <algorithm>
#include <initializer_list>
#include <map>
#include <set>
#include <string>

////////////////////////////////////////////////////////////////////////////////

class can
{
public:
    template<typename _InputIterator>
    void insert(const std::string& host, _InputIterator __first, _InputIterator __last)
    {
        hosts[host].insert(__first, __last);

        std::for_each(__first, __last, [&](std::string file){ files[file].insert(host); });
    }

    void insert(const std::string& host, const std::initializer_list<std::string>& collection);

    void erase(const std::string& host);

    std::set<std::string> get_files() const;

    std::set<std::string> get_hosts() const;

    std::set<std::string> get_hosts(const std::string& file) const;

protected:
    std::map<std::string,std::set<std::string>> files;
    std::map<std::string,std::set<std::string>> hosts;
};

////////////////////////////////////////////////////////////////////////////////

#endif
